package com.cinc.ebc.sd.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cinc.ebc.sd.constant.SdConstant;
import com.cinc.ebc.sd.entity.SdDispatchNotice;
import com.cinc.ebc.sd.entity.SdDispatchNoticeDetail;
import com.cinc.ebc.sd.mapper.SdDispatchNoticeDetailMapper;
import com.cinc.ebc.sd.mapper.SdDispatchNoticeMapper;
import com.cinc.ebc.sd.service.ISdDispatchNoticeService;
import com.cinc.ebc.sd.service.ISdSalesOrderService;
import org.jeecg.common.util.oConvertUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * @Description: 发货通知
 * @Author: jeecg-boot
 * @Date: 2022-09-25
 * @Version: V1.0
 */
@Service
public class SdDispatchNoticeServiceImpl extends ServiceImpl<SdDispatchNoticeMapper, SdDispatchNotice> implements ISdDispatchNoticeService {

    @Autowired
    private SdDispatchNoticeMapper sdDispatchNoticeMapper;
    @Autowired
    private SdDispatchNoticeDetailMapper sdDispatchNoticeDetailMapper;

    @Autowired
    private ISdSalesOrderService sdSalesOrderService;

    @Override
    @Transactional
    public void saveMain(SdDispatchNotice sdDispatchNotice, List<SdDispatchNoticeDetail> sdDispatchNoticeDetailList) {
        sdDispatchNoticeMapper.insert(sdDispatchNotice);
        if (sdDispatchNoticeDetailList != null && sdDispatchNoticeDetailList.size() > 0) {
            for (SdDispatchNoticeDetail entity : sdDispatchNoticeDetailList) {
                //外键设置
                entity.setMainId(sdDispatchNotice.getId());
                sdDispatchNoticeDetailMapper.insert(entity);
            }
        }
        // 更新销售订单
        sdSalesOrderService.autoUpdateSalesOrder(sdDispatchNotice.getSalesOrderId());
    }

    @Override
    @Transactional
    public void updateMain(SdDispatchNotice sdDispatchNotice, List<SdDispatchNoticeDetail> sdDispatchNoticeDetailList) {
        SdDispatchNotice sdDispatchNoticeResponse = sdDispatchNoticeMapper.selectById(sdDispatchNotice.getId());
        if(!SdConstant.SAL_NOTICE_STATUS01.equals(sdDispatchNoticeResponse.getStatus())){
            throw new RuntimeException("当前状态不能修改");
        }
        sdDispatchNoticeMapper.updateById(sdDispatchNotice);
        //1.先删除子表数据
        sdDispatchNoticeDetailMapper.deleteByMainId(sdDispatchNotice.getId());

        //2.子表数据重新插入
        if (sdDispatchNoticeDetailList != null && sdDispatchNoticeDetailList.size() > 0) {
            for (SdDispatchNoticeDetail entity : sdDispatchNoticeDetailList) {
                //外键设置
                entity.setMainId(sdDispatchNotice.getId());
                sdDispatchNoticeDetailMapper.insert(entity);
            }
        }
        // 更新销售订单
        sdSalesOrderService.autoUpdateSalesOrder(sdDispatchNotice.getSalesOrderId());
    }

    @Override
    @Transactional
    public void delMain(String id) {
        SdDispatchNotice sdDispatchNotice = sdDispatchNoticeMapper.selectById(id);
        if(!SdConstant.SAL_NOTICE_STATUS01.equals(sdDispatchNotice.getStatus())){
            throw new RuntimeException("当前状态不能删除");
        }
        sdDispatchNoticeDetailMapper.deleteByMainId(id);
        sdDispatchNoticeMapper.deleteById(id);
        // 更新销售订单
        sdSalesOrderService.autoUpdateSalesOrder(sdDispatchNotice.getSalesOrderId());
    }

    @Override
    @Transactional
    public void delBatchMain(Collection<? extends Serializable> idList) {
        for (Serializable id : idList) {
            delMain(id.toString());
        }
    }

    @Transactional
    @Override
    public void autoUpdateDispatchNotice(String id) {
        SdDispatchNotice sdDispatchNotice = sdDispatchNoticeMapper.selectById(id);
        if (SdConstant.SAL_NOTICE_STATUS03.equals(sdDispatchNotice.getStatus())) {
            // 完成状态的单据，不处理
            return;
        }
        // 更新明细
        List<SdDispatchNoticeDetail> dispatchNoticeDetailList = sdDispatchNoticeDetailMapper.selectByMainId(id);
        if (oConvertUtils.listIsNotEmpty(dispatchNoticeDetailList)) {
            for (SdDispatchNoticeDetail dispatchNoticeDetail : dispatchNoticeDetailList) {
                // 数量更新
                sdDispatchNoticeDetailMapper.autoUpdateQtyInfo(dispatchNoticeDetail.getId());
                // 状态更新
                sdDispatchNoticeDetailMapper.autoUpdateStatus(dispatchNoticeDetail.getId());
            }
        }
        // 更新主表
        sdDispatchNoticeMapper.autoUpdateStatus(id);
    }

}
